package com.alibaba.algo.cooperation.feign.service;

import com.alibaba.algo.cooperation.common.BaseResult;
import com.alibaba.algo.cooperation.feign.config.FeignConfiguration;
import com.alibaba.algo.cooperation.feign.vo.req.*;
import com.alibaba.algo.cooperation.feign.vo.res.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

/**
 * @author Fan.tianpeng
 * @date 2021/5/8 10:11
 */
@FeignClient(url="${feign.userCenterUrl:}", value = "usercenter-service", contextId = "usercenter-org", configuration = FeignConfiguration.class)
@Api(value = "组织管理(外部)", tags = "组织管理(外部)")
public interface OrgFeignService {

    /**
     * 获取组织下的员工列表
     *
     * @param vo 组织标识
     * @return 用户列表
     */
    @ApiOperation(value = "获取组织下的员工列表")
    @RequestMapping(value = "feignApi/userCenter/org/qryEmployeeListByOrgId", method = RequestMethod.POST)
    BaseResult<List<OrgEmployeeInfoResVO>> qryEmployeeListByOrgId(@RequestBody SelectOrgEmployeeReqVO vo);

    /**
     * 获取组织下的用户列表不支持租户
     *
     * @param vo 组织标识
     * @return 用户列表
     */
    @ApiOperation(value = "获取组织下的用户列表不支持租户", notes = "支持全量或有效查询，默认为全量")
    @RequestMapping(value = "feignApi/userCenter/org/qryUserListByOrgId", method = RequestMethod.POST)
    BaseResult<List<OrgUserInfoResVO>> qryUserListByOrgId(@RequestBody SelectOrgUserReqVO vo);


    /**
     * 根据组织和租户条件查询用户列表
     *
     * @param vo 组织标识
     * @return 用户列表
     */
    @ApiOperation(value = "获取组织下的用户列表支持租户")
    @RequestMapping(value = "feignApi/userCenter/users", method = RequestMethod.POST)
    BaseResult<List<OrgUserInfoResVO>> qryUserListByOrg(@RequestBody SelectOrgUserReqVO vo);

    @ApiOperation(value = "获取某组织及其子孙组织下的用户列表")
    @RequestMapping(value = "feignApi/userCenter/org/qryUserListByBaseOrg", method = RequestMethod.POST)
    BaseResult<List<OrgUserInfoResVO>> qryUserListByBaseOrg(@RequestBody SelectOrgUserReqVO vo);

    @ApiOperation(value = "分页获取某组织及其子孙组织下的用户列表")
    @RequestMapping(value = "feignApi/userCenter/org/qryUserListPageByBaseOrg", method = RequestMethod.POST)
    BaseResult<List<OrgUserInfoResVO>> qryUserListPageByBaseOrg(@RequestBody SelectOrgUserReqVO vo);

    /**
     * 根据组织uuid获取组织下的用户列表
     *
     * @param vo 组织uuid标识
     * @return 用户列表
     */
    @ApiOperation(value = "根据组织uuid获取组织下的用户列表")
    @RequestMapping(value = "feignApi/userCenter/org/qryUserListByOrgUuId", method = RequestMethod.POST)
    BaseResult<List<OrgUserInfoResVO>> qryUserListByOrgUuId(@RequestBody SelectOrgUserUuidReqVO vo);

    /**
     * 获取当前组织下的子组织列表
     *
     * @param vo 父级组织标识
     * @return 组织列表
     */
    @ApiOperation(value = "获取当前组织下的子组织列表")
    @RequestMapping(value = "feignApi/userCenter/org/qryOrgListByParentOrgId", method = RequestMethod.POST)
    BaseResult<List<OrgInfoResVO>> qryOrgListByParentOrgId(@RequestBody SelectParentOrgReqVO vo);

    /**
     * 根据父级组织uuid获取当前组织下的子组织列表
     *
     * @param vo 父级组织uuid
     * @return 组织列表
     */
    @ApiOperation(value = "根据父级组织uuid获取当前组织下的子组织列表")
    @RequestMapping(value = "feignApi/userCenter/org/qryOrgListByParentOrgUuid", method = RequestMethod.POST)
    BaseResult<List<OrgInfoResVO>> qryOrgListByParentOrgUuid(@RequestBody SelectParentOrgUuidReqVO vo);

    /**
     * 通过组织id列表查询对应的组织名称映射关系
     *
     * @param vo 组织id列表
     * @return 组织映射关系
     */
    @ApiOperation(value = "通过组织id列表查询对应的组织名称映射关系",notes = "仅支持全量查询")
    @RequestMapping(value = "feignApi/userCenter/org/qryOrgNameMap", method = RequestMethod.POST)
    BaseResult<Map<Long, String>> qryOrgNameMap(@RequestBody List<Long> vo);


    @ApiOperation(value = "根据组织编码集合查询组织编码和组织id的对应关系map集合",notes = "查询全量数据,支持范围查询批量调用,批量查询不能超过1000条")
    @RequestMapping(value = "feignApi/userCenter/org/qryOrgIdMapByOrgCodes", method = RequestMethod.POST)
    BaseResult<Map<String, Long>> qryOrgIdMapByOrgCodes(@RequestBody List<String> vo);

    /**
     * 查询顶层组织
     * @return
     */
    @ApiOperation(value = "获取根组织")
    @RequestMapping(value = "feignApi/userCenter/org/getFirstLevelOrgList", method = RequestMethod.POST)
    List<FeignGetFirstLevelOrgResponseVO> getFirstLevelOrgList();


    /**
     *
     * @return
     */
    @ApiOperation(value = "获取根组织")
    @RequestMapping(value = "feignApi/userCenter/org/getFirstLevelOrgListByParam", method = RequestMethod.POST)
    List<FeignGetFirstLevelOrgResponseVO> getFirstLevelOrgListByParam(@RequestBody GetFirstLevelOrgReqVo vo);

    /**
     * 根据人员信息或者组织信息模糊匹配，返回组织树结构
     * @param vo
     * @return
     */
    @ApiOperation(value="根据人员信息或者组织信息模糊匹配，返回组织树结构")
    @RequestMapping(value = "feignApi/userCenter/org/selectOrgTreeByCondition", method = RequestMethod.POST)
    BaseResult selectOrgTreeByCondition(@RequestBody SelectOrgUserEmployeeVO vo);


    /**
     * 根据部门ID/编码和角色ID/编码条件查询用户列表(组织和角色两者必传)--mom冬泉
     *  查询组织和角色下用户交集
     * @param sysOrgRoleReqVOList 组织角色列表
     * @return 用户列表
     */
    @ApiOperation(value = "获取组织和角色下的用户列表(组织和角色两者必传)")
    @RequestMapping(value = "feignApi/userCenter/org/qryUserListByOrgAndRole", method = RequestMethod.POST)
    BaseResult<List<UserInfoResVO>> qryUserListByOrgAndRole(@RequestBody List<SysOrgRoleReqVO> sysOrgRoleReqVOList);

    /** 根据部门ID/编码和角色ID/编码条件查询用户列表(组织和角色可只传一个)--李浩
     * 接口说明：
     * 1.只传组织，查询组织下的用户
     * 2.只传角色，查询角色下的用户
     * 3.组织和角色两者都传，查询组织和角色下用户交集
     * @param sysOrgRoleReqVOList 组织角色列表
     * @return 用户列表
     */
    @ApiOperation(value = "获取组织和角色下的用户列表(组织和角色可只传一个)")
    @RequestMapping(value = "feignApi/userCenter/org/qryUserListByOrgAndRoleExtend", method = RequestMethod.POST)
    BaseResult<List<UserInfoResVO>> qryUserListByOrgAndRoleExtend(@RequestBody List<SysOrgRoleReqVO> sysOrgRoleReqVOList);


    /**
     * 根据orgId或orgCode获取组织详情
     *
     * @param vo
     * @return 用户列表
     */
    @ApiOperation(value = "获取组织详情", notes = "支持全量或有效查询，默认为全量")
    @RequestMapping(value = "feignApi/userCenter/org/getOrgDetail", method = RequestMethod.POST)
    BaseResult<FeignOrgDetailResponse> getOrgDetail(@RequestBody GetOrgDetailReqVo vo);

    /**
     * 分页查询组织信息
     * @param vo 查询条件对象，包含同后管页面的条件
     * @return
     */
    @RequestMapping(value = "feignApi/userCenter/org/selectPage", method = RequestMethod.POST)
    BaseResult selectPage(@RequestBody SelectOrgListRequestVO vo);


    @ApiOperation(value = "根据组织id或编码查询组织及其所有子组织列表")
    @RequestMapping(value = "feignApi/userCenter/org/selectOrgAndChildListByCondition", method = RequestMethod.POST)
    BaseResult selectOrgAndChildListByCondition(@RequestBody SelectOrgListRequestVO vo);

    /**
     * 切换当前登录组织
     *
     * @param vo 组织标识
     */
    @ApiOperation(value = "切换当前登录组织")
    @RequestMapping(value = "feignApi/userCenter/org/insertOrUpdateCurrentOrg", method = RequestMethod.POST)
    BaseResult<Boolean> insertOrUpdateCurrentOrg(@RequestBody @Validated AddOrUpdateCurrentOrgVO vo);

    /**
     * 通过父级组织编码和当前组织名称查询组织列表
     * @param vo
     * @return
     */
    @ApiOperation(value = "通过父级组织编码和当前组织名称查询组织信息")
    @RequestMapping(value = "feignApi/userCenter/org/qryOrgListByOrgNameAndParentCode", method = RequestMethod.POST)
    BaseResult<List<OrgInfoResVO>> selectOrgListByOrgNameAndParentCode(@RequestBody SelectOrgByNameParentReqVO vo);

    /**
     * 通过父级组织编码和当前组织名称查询组织列表
     * @param orgId 组织id
     * @return  上级组织信息
     */
    @ApiOperation(value = "获取当前组织的所有上级组织")
    @RequestMapping(value = "feignApi/userCenter/org/qryParentOrgByCurrentOrgId", method = RequestMethod.POST)
    BaseResult<List<OrgInfoVO>> selectParentOrgByCurrentOrgId(@RequestParam(value = "orgId") Long orgId);
}
